#include "..\System\os_link.h"
#include "..\User\led.h"
#include "..\User\cmp.h"
#include "..\User\eeprom.h"

#define EE_address  0x0000  //保存的EEPROM起始地址

bit LowVolFlag;     //低电压标志

s_u16_t Test_cnt;   //测试用的秒计数变量
s_u16_t Temp_cnt;   //保存用的秒计数变量
s_u8_t  tmp[2];     //通用数组

uCreateBin(bin_1, 0);

uCreateTask(cmp_task, 4, 128, 0, 0) {
    if(uTakeBin(bin_1, ~0))
    {
        if(CMPCR1 & 0x01)
        {
            // 不是低电压
            if(LowVolFlag)
            {
                LowVolFlag = 0;    //清除低电压标志
                if(Test_cnt != Temp_cnt)
                {
                    EEPROM_read_n(EE_address, tmp,2);        //读出2字节
                    Test_cnt = ((s_u16_t)tmp[0] << 8) + tmp[1]; //秒计数
                    if(Test_cnt > 10000) 
                    {
                        Test_cnt = 0;   //秒计数范围为0~10000
                    }
                    Temp_cnt = Test_cnt;
                    
                    refreshDisplay(Test_cnt);
                }
            }
        }
        else
        {
            close();
            if(!LowVolFlag)
            {
                LowVolFlag = 1;    //设置低电压标志
                if(Test_cnt != Temp_cnt)
                {
                    Temp_cnt = Test_cnt;
                    EEPROM_SectorErase(EE_address); //擦除扇区
                    tmp[0] = (s_u8_t)(Temp_cnt >> 8);
                    tmp[1] = (s_u8_t)Temp_cnt;
                    EEPROM_write_n(EE_address, tmp,2);
                }
            }
        }
    }


    uEndTasking;
}

void initCmp(void) 
{
    /**
     * 0000 0000
     * B7-B6: 比较器迟滞输入选择：0mv
     */
    CMPEXCFG = 0x00;
//  CMPEXCFG |= 0x40;                           //比较器DC迟滞输入选择，0:0mV; 0x40:10mV; 0x80:20mV; 0xc0:30mV

//  CMPEXCFG &= ~0x04;                          //P3.6为CMP-输入脚
    /**
     * 0000 0000 ｜ 0000 0100 = 0000 0100
     * B2: 比较器负端输入选择， 这里为内部1.19V
     */
    CMPEXCFG |= 0x04;                           //内部1.19V参考电压为CMP-输入脚

    /**
     * 0000 0100 & 1111 1100 = 0000 0100
     * B1-B0: 设置比较器的正端，这里为P37
     */
    CMPEXCFG &= ~0x03;                          //P3.7为CMP+输入脚 0000 0011 1111 1100

    CMPCR2 = 0x00;
    CMPCR2 &= ~0x80;                            //比较器正向输出 0000 0000 & 0111 1111 = 0000 0000 
    CMPCR2 &= ~0x40;                            //使能0.1us滤波 0000 0000 & 1011 1111 = 0000 0000 
    CMPCR2 |= 0x10;                             //比较器结果经过16个去抖时钟后输出 

    CMPCR1 = 0x00;
    CMPCR1 |= 0x30;                             //使能比较器边沿中断

    CMPCR1 |= 0x02;                             //使能比较器输出

    P_SW2 &= ~0x08;                             //选择P3.4作为比较器输出脚
    CMPCR1 |= 0x80;                             //使能比较器模块
}

void addSecond(void) 
{
    if(LowVolFlag) {
        return;
    }

    Test_cnt++;         //秒计数+1
    if(Test_cnt > 10000) 
    {
        Test_cnt = 0;   //秒计数范围为0~10000
    }
    refreshDisplay(Test_cnt);
    
}

bit isLowPv(void) {
    return LowVolFlag;
}

/******************* 比较器中断函数 ********************/
void CMP_Isr() interrupt 21
{
    CMPCR1 &= ~0x40;                         //清中断标志
    P47 = CMPCR1 & 0x01;                     //中断方式读取比较器比较结果， 1表示正端高于负端
    
    iGiveBin(bin_1);
}